package cn.whdream.juc;
/**
 * 
 * @author admin
 * 论证内存可见性，需要处理的必要性
 * volatile 多个线程访问共享数据时，共享数据是彼此可见的
 * 可以理解成 线程1-写 ——》 主存——》 主线程读 打印 
 */
public class TestVolatileDemo1 {
	public static void main(String[] args) {
		//当线程开始
		Demo d = new Demo();
		new Thread(d).start();
		
		while (true) {
			//该 死循环 一直在拉取 main线程缓存中值，无法有机会再次重新读取 被子线程刷新后的value
			//a. 使用 同步锁可以保证值每次都进行读取,但是效率比较低
			//synchronized (d) {
				if(d.flag) {
					System.out.println("`````````````````````");
					break;
				}
			//}
		}
	}
	
	private static class Demo implements Runnable{
		private volatile boolean flag = false;//保证了可见性
		
		@Override
		public void run() {
			//当子线程被挂起
			try {
				Thread.sleep(200);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			//然后再次修改该值,将当前线程开辟的内存中的 flag修改后，同步回去
			flag = true;
			System.out.println(flag+"值修改完毕");
		}
		public boolean isFlag() {
			return flag;
		}
		public void setFlag(boolean flag) {
			this.flag = flag;
		}
		
	}
}
